#============================================
#知识点
#1.元组，列表，字符串，文件，字典都是可迭代对象
#2.for循环时通过可迭代对象来循环的 
# for i in 可迭代对象.__iter__()（转换为迭代器对象）
#for循环步骤:
#1、d.__ iter__ ()得到一个迭代器对象
#2、迭代器对象.__ next__ ()拿到一个返回值，然后将该返回值赋值给i(迭代器对象才可以用__next__())
#3、循环往复步骤2， 直到抛出StopIteration异常for循环会捕捉异常然后结束循环
#3.文件既是迭代器对象也是可迭代对象,所以可以直接用for i in 文件对象


#4.生成器定义一个函数  使用yeild
#============================================
# a = {"a":1,"b":2}
# x = a.__iter__()     #将a转换为迭代器对象 
# for i in x:
#     print(i)
# duix = x.__next__()  #输出迭代s内容，返回完，会抛出异常
# duix.__iter__()      #对迭代对象使用__iter__()返回时它本身作用于for 循环
#============================================
#生成器
def qwq():
    print("1")
    yield 12
    print("2")
    yield 22
    print("3")
    yield 32
    print("4")
    yield 42
g = qwq()   #生成一个迭代器对象（生成器）与程序无关，但是程序要运行,这个g必须得next
# print(g)
# for i in g:   
#     print(i)    #会触发函数体代码(迭代器)的运行，使用next(这个迭代对象)然后
                #每遇到一个yieLd就会停下来，将yield后的值当作本次调用的结果
                #意味着yield多了一个让函数暂停状态的功能，后面很有用
res = next(g)
print(res)
#============================================
#例子
# def myrange(start,stop,step):  #生成一个迭代器
#     while start<stop:
#         yield start
#         start+=step


# for i in myrange(1,10,1):   #for 循环对于迭代器的用法next()
#     print(i)

#迭代器优点，它只占一个地址空间，可以产生无穷多个数据，只是一个功能（惰性）
#缺点：1是一个一次性的，不能倒退，而且是直接遍历，不能选择位置